From 776588f530eb27d55396aaa268e2bb47c44ae5f1 Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild.aw" Date: Wed, 22 Mar 2006 08:57:48 -0700 Subject: [PATCH] [IA64] Fixed VTI domain destruction This patch fixed the VTI domain destruction processing. I tested creation/destruction domU. The "domU" which I tested is VTI domain and non VTI domain. There was not the memory leak issue, and VTI domain is not left in a zombie state. Signed-off-by: Masaki Kanno --- xen/arch/ia64/vmx/vmmu.c | 14 ++++++++++++++ xen/arch/ia64/vmx/vmx_init.c | 20 ++++++++++++++++++++ xen/arch/ia64/xen/dom0_ops.c | 7 +++++-- xen/arch/ia64/xen/domain.c | 9 +++++++-- xen/include/asm-ia64/vmmu.h | 1 + xen/include/asm-ia64/vmx.h | 4 +++- 6 files changed, 50 insertions(+), 5 deletions(-) diff --git a/xen/arch/ia64/vmx/vmmu.c b/xen/arch/ia64/vmx/vmmu.c index 1be237166d..b19885f83e 100644 --- a/xen/arch/ia64/vmx/vmmu.c +++ b/xen/arch/ia64/vmx/vmmu.c @@ -185,6 +185,20 @@ thash_cb_t *init_domain_tlb(struct vcpu *d) return tlb; } +void free_domain_tlb(struct vcpu *v) +{ + struct page_info *page; + void *vhptbase; + thash_cb_t *tlb; + + if ( v->arch.vtlb ) { + tlb = v->arch.vtlb; + vhptbase = (void*)((u64)tlb + sizeof (thash_cb_t)) - VCPU_VHPT_SIZE; + page = virt_to_page(vhptbase); + free_domheap_pages(page, VCPU_VHPT_ORDER); + } +} + /* * Insert guest TLB to machine TLB. * data: In TLB format diff --git a/xen/arch/ia64/vmx/vmx_init.c b/xen/arch/ia64/vmx/vmx_init.c index 4db33d1300..84ff3310b2 100644 --- a/xen/arch/ia64/vmx/vmx_init.c +++ b/xen/arch/ia64/vmx/vmx_init.c @@ -186,6 +186,13 @@ static vpd_t *alloc_vpd(void) return vpd; } +/* Free vpd to xenheap */ +static void +free_vpd(struct vcpu *v) +{ + if ( v->arch.privregs ) + free_xenheap_pages(v->arch.privregs, get_order(VPD_SIZE)); +} /* * Create a VP on intialized VMX environment. @@ -261,6 +268,8 @@ vmx_final_setup_guest(struct vcpu *v) { vpd_t *vpd; + free_xenheap_pages(v->arch.privregs, get_order(sizeof(mapped_regs_t))); + vpd = alloc_vpd(); ASSERT(vpd); @@ -290,6 +299,17 @@ vmx_final_setup_guest(struct vcpu *v) set_bit(ARCH_VMX_INTR_ASSIST, &v->arch.arch_vmx.flags); } +void +vmx_relinquish_vcpu_resources(struct vcpu *v) +{ + vtime_t *vtm = &(v->arch.arch_vmx.vtm); + + kill_timer(&vtm->vtm_timer); + + free_domain_tlb(v); + free_vpd(v); +} + typedef struct io_range { unsigned long start; unsigned long size; diff --git a/xen/arch/ia64/xen/dom0_ops.c b/xen/arch/ia64/xen/dom0_ops.c index 857f0ab767..2ed4bb8aa7 100644 --- a/xen/arch/ia64/xen/dom0_ops.c +++ b/xen/arch/ia64/xen/dom0_ops.c @@ -174,8 +174,11 @@ long arch_do_dom0_op(dom0_op_t *op, GUEST_HANDLE(dom0_op_t) u_dom0_op) */ if ( (op->u.getmemlist.max_pfns == -1UL) && !test_bit(ARCH_VMX_CONTIG_MEM, - &d->vcpu[0]->arch.arch_vmx.flags) ) - return vmx_alloc_contig_pages(d) ? (-ENOMEM) : 0; + &d->vcpu[0]->arch.arch_vmx.flags) ) { + ret = (long) vmx_alloc_contig_pages(d); + put_domain(d); + return ret ? (-ENOMEM) : 0; + } for ( i = start_page; i < (start_page + nr_pages); i++ ) { diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c index 0deb58200f..372566f84b 100644 --- a/xen/arch/ia64/xen/domain.c +++ b/xen/arch/ia64/xen/domain.c @@ -211,8 +211,13 @@ struct vcpu *alloc_vcpu_struct(struct domain *d, unsigned int vcpu_id) void free_vcpu_struct(struct vcpu *v) { - if (v->arch.privregs != NULL) - free_xenheap_pages(v->arch.privregs, get_order(sizeof(mapped_regs_t))); + if (VMX_DOMAIN(v)) + vmx_relinquish_vcpu_resources(v); + else { + if (v->arch.privregs != NULL) + free_xenheap_pages(v->arch.privregs, get_order(sizeof(mapped_regs_t))); + } + free_xenheap_pages(v, KERNEL_STACK_SIZE_ORDER); } diff --git a/xen/include/asm-ia64/vmmu.h b/xen/include/asm-ia64/vmmu.h index d519474362..9d1ac34b49 100644 --- a/xen/include/asm-ia64/vmmu.h +++ b/xen/include/asm-ia64/vmmu.h @@ -373,6 +373,7 @@ extern void purge_machine_tc_by_domid(domid_t domid); extern void machine_tlb_insert(struct vcpu *d, thash_data_t *tlb); extern ia64_rr vmmu_get_rr(struct vcpu *vcpu, u64 va); extern thash_cb_t *init_domain_tlb(struct vcpu *d); +extern void free_domain_tlb(struct vcpu *v); extern thash_data_t * vsa_thash(PTA vpta, u64 va, u64 vrr, u64 *tag); extern thash_data_t * vhpt_lookup(u64 va); extern void machine_tlb_purge(u64 va, u64 ps); diff --git a/xen/include/asm-ia64/vmx.h b/xen/include/asm-ia64/vmx.h index 4674e9149d..c7eaf007a2 100644 --- a/xen/include/asm-ia64/vmx.h +++ b/xen/include/asm-ia64/vmx.h @@ -51,7 +51,9 @@ extern void set_ifa_itir_iha (struct vcpu *vcpu, u64 vadr, extern void inject_guest_interruption(struct vcpu *vcpu, u64 vec); extern void vmx_intr_assist(struct vcpu *v); extern void set_illegal_op_isr (struct vcpu *vcpu); -extern void illegal_op (struct vcpu *vcpu); +extern void illegal_op (struct vcpu *vcpu); +extern void vmx_relinquish_vcpu_resources(struct vcpu *v); + static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu) { return &((shared_iopage_t *)d->arch.vmx_platform.shared_page_va)->vcpu_iodata[cpu]; -- 2.30.2